// 数据类型

// 原始类型

// 字符串
const str: string = 'hello world'
// 数值
const num: number = 123
// 布尔
const bool: boolean = true
// 符号: 值唯一且不可改变
const sym: symbol = Symbol('haha')
// 大整数
const bigInt: bigint = 123n

// 对象类型

// 数组
const arr: number[] = [1, 2, 3]
const arr2: Array<number> = [1, 2, 3]
// 元组: 元组不是基本类型, 也没有对应的关键字, 它是一个特殊的数组类型
const tuple: [number, string] = [1, '1']
// 枚举
enum Color {
    Red,
    Green,
    Blue
}
// 对象
const obj: object = {
    name: '张三',
    age: 18
}

// 特殊类型

// 任意类型
let any: any = 1
any = '1'
any = true
// 安全版任意类型
let any2: unknown = 1
any2 = '1'
any2 = true
if (typeof any2 === 'string') {
    any2.toUpperCase()
}
// 空类型
const empty: void = undefined
const nul: null = null
// 字面量类型: 值只能是字面量的值, 枚举类型也是字面量类型, 字面量类型一般和下面的联合类型搭配使用更合适
const literal: 'hello' = 'hello'
let literal1: 'hello' | 'word' = 'hello'
literal1 = 'word'
// never类型: 永远不会正常返回或永远不会有值, 开发基本不用, 运行这个ts文件时这里要注释不然这里手动报错走不下去
let never: never = (() => {
    throw new Error('错误')
})()

// 其他类型

// 联合类型
const union: string | number | boolean = '1'
// 交叉类型
const trait: any & unknown = '1'
// 别名类型
type alias = string | number | boolean
// 断言类型: 类似于强制转换
const assert: string = <string>'1'
const assert1: string = (assert as string)
// 函数类型
const fn: (a: string, b: number) => boolean = (a, b) => true